Network data storage is most economically provided by an array of low-cost disk drives integrated with a large semiconductor cache memory. A number of data mover computers are used to interface the cached disk array to the network. The data mover computers perform file locking management and mapping of network files to logical block addresses of storage in the cached disk array, and move data between network clients and the storage in the cached disk array. See, for example, Vahalia et al. U.S. Pat. No. 5,893,140 issued Apr. 6, 1999, entitled “File Server Having a File System Cache and Protocol for Truly Safe Asynchronous Writes,” incorporated herein by reference.
A UNIX-based file system permits each logical block in the extent of a file to be mapped to any physical block of storage the cached disk array. The UNIX-based file system also supports sparse files and possible sharing of specified data blocks between files for enabling “write somewhere else” snapshot copies, and de-duplication of specified data blocks
The organization and management of a UNIX-based file system is described in Uresh Vahalia, Unix Internals—The New Frontiers, Chapter 9, File System Implementations, pp. 261-290, Prentice-Hall, Inc., Upper Saddle River, N.J. (1996). Files in a file system are organized in a hierarchy including a root directory, zero or more subdirectories, and zero or more regular data files. Each file itself is a hierarchy of file system blocks including an inode, one or more data blocks, and zero or more indirect blocks. Each file system data block in the file is linked to the inode or an indirect block of the file by a pointer in the inode or indirect block. There is a fixed and predetermined relationship between a given offset in the file and the location of the pointer field for a pointer to the data block containing the file data for the given offset in the file. The pointer in the block pointer field of an inode or an indirect block may have a zero value indicating that there is a “hole” in the extent of the file. Such a hole in the extent of the file represents a data block filed with zeroes.
Different UNIX-based file systems have used different file system block sizes. For example, some early UNIX-based file systems used a file system block size of 1 kilobyte, and more current versions use a file system block size of eight kilobytes. File system block size is known to affect file system performance in various ways. For example, a small block size is efficient for storing small files, such as files having an extent of data no greater than the block size. A large block size has a greater chance of a file's sectors being contiguous, and reduces the amount of overhead to list the file's blocks.